home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Disc to the Future 2
/
Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin
/
MAC
/
THINKC
/
5
/
XCSHELL
/
XCMD.C
< prev
next >
Wrap
Text File
|
1991-08-31
|
3KB
|
121 lines
//
// "XcShell" Skeletal XCMD/XFCN XCMD subfunction checks and router
//
// Copyright ⌐1991 Mark M. Owen -- All rights reserved
//
#define _XCMD_
#include "XCMDutils.h"
#include "XCMDversion.h"
#include "XCMD.h"
#define STRING(n) *(paramPtr->params[(n)])
#define ERROR(msg) { Fail( paramPtr, (msg) ); return false; }
#define CHKERROR(msg) { int err = (msg); if(err) ERROR(err); }
semiprivate void UnlockParams (XCmdBlockPtr paramPtr);
semiprivate void Fail (XCmdBlockPtr paramPtr,int msg);
semiprivate int verbNumber (char *theVerb,pGlobals pGlb);
int XCMD(XCmdBlockPtr paramPtr,hGlobals hGlb)
{
GrafPtr port;
Boolean rtn = LIVE;
char str[256];
char verbStr[256];
int theVerb;
int nParams;
long ip[16];
register
int i = 16;
register
pGlobals pGlb;
register
long *pip= ip;
while( i-- ) *pip++ = 0; // clear the long parameter containers
GetPort( &port ); // save current port for later restoration
global_paramPtr = paramPtr; // used by SetReturnValue
SetReturnValue( "\p" ); // assure empty result initially
if( !hGlb ) // caller supplied no globals╔
return DEAD;
for(i=0;i<paramPtr->paramCount;i++) { // immobilize the parameter handles
MoveHHi( (Handle)paramPtr->params[i] );
HLock( (Handle)paramPtr->params[i] );
}
if( paramPtr->paramCount < 1 ) // need at least a verb (XCMD function)
ERROR( errMissingFunction );
pGlb = *hGlb; // dereference global handle
// attempt to decode the verb
zero2pas( STRING(0), verbStr ); // convert C string to Pascal
if( (theVerb = verbNumber( verbStr, pGlb )) == vInError )
ERROR( errUnrecognizedVerb );
nParams = ( theVerb >= 0 && theVerb < pGlb->nVerbs )?
*(((char*)((*((short**)(pGlb->hNParams)))+1))+theVerb) + 1 // Get minimum number of parameters expected
:
32767
;
// Check parameter count limits for verbs with optional parameters. If an optional
// parameter is missing, supply an appropriate default value.
switch( theVerb ) {
//////////////////////////////////////////////////////////////
// verify variable parameter count verbs here╔ //
//////////////////////////////////////////////////////////////
default:
if( paramPtr->paramCount != nParams )
ERROR( errWrongParamCount );
}
if (nParams > 1 ) { // convert parameter strings to internal numeric formats
i = 0;
pip = ip;
while( i < nParams ) {
zero2pas( STRING( i++ ), str );
StringToNum( str, pip++ );
}
}
switch( theVerb ) { // Either do the verb here here or delegate it
case vVersion:
XCMDVersion();
break;
case vDispose:
rtn = DEAD;
break;
//////////////////////////////////////////////////////////////
// as in the above cases, route to other verbs here╔ //
//////////////////////////////////////////////////////////////
default:
ERROR( errUnrecognizedVerb );
break;
}
UnlockParams( paramPtr ); // unlock some of our locked memory
SetPort( port ); // restore the port in case it was changed
return rtn;
}